package top.hekun.study.reflection;

import top.hekun.study.reflection.model.ReflectionModel;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @Author: 贺坤
 * @Date: 2023/6/28 15:35
 */
public class ReflectionDemo {
    public static void main(String[] args) throws Exception {
        System.out.println("*******************");
        // 获取一个对象
        ReflectionModel test01 = new ReflectionModel();
        // 获取类信息
        Class<? extends ReflectionModel> aClass = test01.getClass();
        // 打印类信息
        System.out.println(aClass);
        // 打印类名称
        System.out.println(aClass.getName());
        // 获取类的构造函数
        Constructor<? extends ReflectionModel> constructor = aClass.getConstructor();
        // 构建实例
        ReflectionModel test01_1 = constructor.newInstance();
        // 调用属性
        System.out.println(test01_1.gy);
        // 调用 方法
        test01_1.println();
        System.out.println("*******************");
        // 类的名称
        String string = aClass.getName();
        // 获取类描述
        Class<?> aClass1 = Class.forName(string);
        // 调用初始化
        ReflectionModel o = (ReflectionModel) aClass1.newInstance();
        // 调用属性
        System.out.println(o.gy);
        // 调用方法
        o.println();
        System.out.println("*******************");
        // 获取类的方法
        Method[] methods = aClass.getMethods();
        //获取所有方法    
        System.out.println("总方法数:" + methods.length);
        // 遍历方法
        for (Method method : methods) {
            System.out.println("方法: " + method.getName());
        }
        System.out.println("*******************");
        Field[] fields = aClass.getDeclaredFields();
        //获取变量
        System.out.println("属性数量:" + fields.length);
        for (Field field : fields) {
            System.out.println("fieldName:" + field.getName());
            if ("gy".equals(field.getName())) {
                System.out.println(field.getName() + ":" + field.get(test01_1));
            }
            field.setAccessible(true);
            if ("sy".equals(field.getName())) {
                System.out.println(field.getName() + ":" + field.get(test01_1));
            }
        }
        System.out.println("*******************");
    }
}
